package tests;
import org.junit.Before;
import org.junit.Test;

import queues.exceptions.EmptyQueueException;
import queues.interfaces.IQueue;

public abstract class TestSuiteQueue {
	IQueue<Integer> q;

	@Before
	public abstract void setup(); 
	
	@Test
	public void testAppend() {
		q.append(10);
	}

	@Test
	public void testRemove() {
		q.append(20);
		q.delete();
	}
	
	@Test
	public void testFirst1() throws EmptyQueueException {
		q.first();
	}
	
	@Test
	public void testFirst2() {
		q.append(20);
		q.first();
	}
	
	@Test
	public void testAppend2() {
		q.append(1);
	}
	
	@Test
	public void testAppend3() {
		q.append(0);
		q.append(1);
	}
	
	@Test
	public void testAppend4() {
		q.append(0);
		q.append(1);
		q.append(2);
	}
	
	@Test
	public void testAppend5() {
		for(int i = 0; i < Integer.MAX_VALUE; i++)
		{
			q.append(0);
		}
		q.append(0);
	}
	
	@Test
	public void testAppend6() {
		for(int i = 0; i < Integer.MAX_VALUE-1; i++)
		{
			q.append(0);
		}
		q.append(0);
	}
	
	@Test
	public void testAppend7() {
		q.append(null);
	}
	
	
	@Test
	public void testDelete1() {
		q.delete();
	}
	
	@Test
	public void testDelete2() {
		q.append(1);
		q.delete();
	}
	
	@Test
	public void testDelete3() {
		q.append(1);
		q.append(2);
		q.delete();
		q.delete();
	}
	
	@Test
	public void testDelete4() {
		q.append(null);
		q.delete();
	}
	
	@Test
	public void testDelete5() {
		for(int i=0; i < Integer.MAX_VALUE; i++) {
			q.append(0);
		}
		for(int i=0; i < Integer.MAX_VALUE; i++){
			q.delete();
		}
	}
	
	@Test (expected = EmptyQueueException.class)
	public void testDelete6() {
		for(int i=1; i < Integer.MAX_VALUE; i++) {
			q.append(0);
		}
		for(int i=1; i < Integer.MAX_VALUE; i++){
			q.delete();
		}
	}
}
